package com.wangt.biz.socket;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import java.net.InetSocketAddress;
import java.util.Map;

/**
 * @author gongtan
 */
@Slf4j
public class TCPServerHandler extends ChannelInboundHandlerAdapter {

    // 客户端与服务端创建连接的时候调用
    @Override
    public void channelActive(ChannelHandlerContext context) throws Exception {
        log.info("协议==> TCP：客户端({})与服务端（本机）({})连接成功", context.channel().remoteAddress(), context.channel().localAddress());
        /**
         * IP:Port 对应不同的 客户端 用于后续给客户端发送消息
         * 将 对应的ip设备更改为在线的状态
         */
        TCPCache.INSTANCE.getClientInfoContext().computeIfAbsent(context.channel().remoteAddress().toString().substring(1), k -> context);

    }

    // 客户端与服务端断开连接时调用
    @Override
    public void channelInactive(ChannelHandlerContext context) throws Exception {
        log.info("协议==> TCP：客户端({})与服务端（本机）({})连接关闭",
            context.channel().remoteAddress(), context.channel().localAddress());
        for (Map.Entry<String, ChannelHandlerContext> entry
            : TCPCache.INSTANCE.getClientInfoContext().entrySet()) {
            if (context.equals(entry.getValue())) {
                TCPCache.INSTANCE.getClientInfoContext().remove(entry.getKey());
                //此处将 对应的设备更改为 不在线的状态  ip：port entry.getKey()

            }
        }
    }

    // 服务端接收客户端发送过来的数据结束之后调用
    @Override
    public void channelReadComplete(ChannelHandlerContext context) throws Exception {
        context.flush();
        // System.out.println("信息接收完毕...");
    }

    // 工程出现异常的时候调用
    @Override
    public void exceptionCaught(ChannelHandlerContext context, Throwable cause) throws Exception {
        cause.printStackTrace();
        context.close();
    }

    // 服务端处理客户端websocket请求的核心方法，这里接收了客户端发来的信息
    @Override
    public void channelRead(ChannelHandlerContext context, Object info) throws Exception {
        InetSocketAddress socket = (InetSocketAddress) context.channel().remoteAddress();
        String clientIP = socket.getAddress().getHostAddress();
        String clientPort = String.valueOf(socket.getPort());
        log.info("TCP服务端（本机）收到客户端（{}:{}）的数据：{}", clientIP, clientPort, info);
        /**
         * 针对不同的设备 把数据INFO 进行不同的 转换，解码等操作
         */
    }
}
